package san.java.day10;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * Map用于保存具有映射关系的数据:
 *  1. Map中的key和value都可以是任何引用类型的数据
 *  2. Map中的key不允许重复: equals()方法应返回false
 *  3. key唯一对应一个value
 *
 * Map接口:
 *  HashMap实现:
 *     HashTable和HashMap的相同点与区别:
 *      相同点:
 *          1. 不能保证元素的顺序
 *          2. 判断Key是否相等的方法都是,两个对象通过equals()方法比较相等,
 *          并且两个对象的hashCode()方法的返回值也相等. 保存时是根据HashCode保存的
 *
 *      区别:
 *          1. HashTable是一个古老的Map实现类,不建议使用
 *          2. HashTable是一个线程安全的Map实现,但HashMap是线程不安全的
 *          3. HashTable不允许使用 null 作为 key和value,而HashMap是可以的
 *
 *  TreeMap:
 *      在保存key-value时,会根据key进行排序: (自然排序即是字典序)
 *          1. 自然排序: key实现Comparable接口,所有的key应该是同一个类的对象,否则将会抛出类型转换错误
 *          2. 定制排序: 在TreeMap构造时, 输入一个Comparator对象
 */

public class Map_07 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("san", 26);
        map.put("lisi", 26);
        map.put("wangwu", 30);

        System.out.println(map);
        int i = map.get("san");
        System.out.println(i);

        System.out.println(map.size());
        System.out.println(map.containsKey("san"));
        System.out.println(map.containsValue(30));

        // 清空集合
//        map.clear();

        // 遍历
        map.keySet();
        map.values();

        for (String key: map.keySet()) {
            System.out.println("key: " + key + ", value: " + map.get(key));
        }

        Set<Map.Entry<String, Integer>> res = map.entrySet();
        for (Map.Entry<String, Integer> en: res) {
            System.out.println("key: " + en.getKey() + ", value: " + en.getValue());
        }

        Map<Integer, String> tMap = new TreeMap<Integer, String>();
        tMap.put(4, "a");
        tMap.put(2, "l");
        tMap.put(3, "f");
        tMap.put(1, "b");

        Map<String, String> tMap1 = new TreeMap<String, String>();
        tMap1.put("a", "a");
        tMap1.put("l", "l");
        tMap1.put("f", "f");
        tMap1.put("b", "b");
        tMap1.put("ab", "ab");

        System.out.println(tMap);
        System.out.println(tMap1);

    }
}

